package com.centerm.common.control;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import com.centerm.common.constant.enums.task.TaskStatus;
import com.centerm.common.constant.error.GlobalErrorEnum;
import com.centerm.common.exception.MyRuntimeException;

public class StatusControl {

	/**
	 * key:新状态，value:允许跳转到新状态的旧状态集合
	 */
	public static Map<Integer,Set<Integer>> taskStatusControlMap = new HashMap<Integer,Set<Integer>>() ;

	/**
     * @Description 统一状态变化map初始化入口
     * @author czy
     * @date 2017年9月20日
     * @param 
     * @return
     */
	public static void initControlMap() {
		initTaskControlMap();
	}

	/**
     * @Description 初始化任务状态合法变化map
     * @author czy
     * @date 2017年9月20日
     * @param 
     * @return
     */
	private static void initTaskControlMap() {
		//设置可跳转至新状态为“进行中”的合法旧状态
		Set<Integer> runningSet = new HashSet<Integer>();
		runningSet.add(TaskStatus.UNRECEIVE.getCode());
		runningSet.add(TaskStatus.SUBMIT.getCode());
		runningSet.add(TaskStatus.APPLY.getCode());
		runningSet.add(TaskStatus.HANG.getCode());
		taskStatusControlMap.put(TaskStatus.RUNNING.getCode(), runningSet);
		//设置可跳转至新状态为“挂起”的合法旧状态
		Set<Integer> hangSet = new HashSet<Integer>();
		hangSet.add(TaskStatus.RUNNING.getCode());
		hangSet.add(TaskStatus.APPLY.getCode());
		taskStatusControlMap.put(TaskStatus.HANG.getCode(), hangSet);
		//设置可跳转至新状态为“提交”的合法旧状态
		Set<Integer> submitSet = new HashSet<Integer>();
		submitSet.add(TaskStatus.RUNNING.getCode());
		submitSet.add(TaskStatus.APPLY.getCode());
		taskStatusControlMap.put(TaskStatus.SUBMIT.getCode(), submitSet);
		//设置可跳转至新状态为“申请延期”的合法旧状态
		Set<Integer> applySet = new HashSet<Integer>();
		applySet.add(TaskStatus.RUNNING.getCode());
		taskStatusControlMap.put(TaskStatus.APPLY.getCode(), applySet);
		//设置可跳转至新状态为“完成”的合法旧状态
		Set<Integer> finishSet = new HashSet<Integer>();
		finishSet.add(TaskStatus.RUNNING.getCode());
		finishSet.add(TaskStatus.APPLY.getCode());
		finishSet.add(TaskStatus.SUBMIT.getCode());
		taskStatusControlMap.put(TaskStatus.FINISH.getCode(), finishSet);
		Set<Integer> deleteSet = new HashSet<Integer>();
		deleteSet.add(TaskStatus.UNRECEIVE.getCode());
		taskStatusControlMap.put(TaskStatus.DELETE.getCode(), deleteSet);
	}
	
	/**
     * @Description 统一判断状态是否是合法跳转
     * @author czy
     * @date 2017年9月20日
     * @param map:状态合法变化map,
     * 		  oldStatus:旧状态
     * 		  newStatus:新状态
     * @return
     */
	public static boolean isPass(Map<Integer,Set<Integer>> map,Integer oldStatus,Integer newStatus){
		if(oldStatus == null||newStatus == null){
			throw new MyRuntimeException(GlobalErrorEnum.PARAM_ERROR);
		}
		//判断状态变化是否合法
		Set<Integer> allowSet = map.get(newStatus);
		if(allowSet==null){
			return false;
		}
		return allowSet.contains(oldStatus);
	}
	
}
